//Servizio
BootApplication
//Servizio per la gestione delle NOTOIFICHE
.service("NotificheSrv",['configuration'
                        ,'$translate'
                        ,"$filter"
                        ,"$http"
                        ,"$timeout"
                        ,"$mdToast"
                        ,"olFormatService"
                        ,"olLayerService"
                        ,"olStyleService"
                        ,"DateService"
                , function(configuration
                		  ,$translate
                		  ,$filter
                		  ,$http
                		  ,$timeout
                		  ,$mdToast
                		  ,olFormatService
                		  ,olLayerService
                		  ,olStyleService
                		  ,DateService
) {
    NotificheService = this;
//Array notificheAlert
    this.notificheAlert = [];
//FUNCTION PER GESTIONE COSTANTI
	this.getConstant = function(_key){
		return configuration.getParam("Constants")[_key];
	};
	this.getContextPath = function(){
		return this.getConstant('ContextPath')
	};
	this.SOURCE_PROJECTION = this.getConstant('SOURCE_PROJECTION');
	this.DEST_PROJECTION   = this.getConstant('DEST_PROJECTION'  );
	
    //USER PREFERENCE
	
	this.userPreference = {};
	
    this.getUserPreference = function(){
 	   req = {method: 'POST'
 		     ,url   : NotificheService.getContextPath() + NotificheService.getConstant('PREFERENZE_NOTIFICHE_CONTEXT_PATH') + NotificheService.getConstant('PREFERENZE_NOTIFICHE_GET_USER_PREFERENCE')
 		     ,params: {}
 	         };
 	   $http(req).then(function(response) {
 		   
 		  if(response.status = 200){
 	            if(response.success || (response.data && response.data.success)){
 	            	NotificheService.userPreference = response.data.aaData;
 	            }
 	        }
                            }
         ,function(error) {}
         );
    };
    this.getUserId = function(){
    	var _defer = $q.defer();
    	req = {method: 'POST'
    		  ,url   : NotificheService.getConstant('URL_USER_GET_USERID')
    		  ,params: {}
    	      };
    	$http(req).then(function(response     ){_defer.resolve(response);}
                       ,function(errorResponse){_defer.resolve(null);}
                       );
    	return _defer.promise;
    };
    //Ritorna array di operazioni da effettuare
    this.getPreferences = function(_data){
    	//Si verifica presenza preferenze per utente    	
    	if(NotificheService.userPreference){
    		//Check su impostazioni per singola regole
    		if(NotificheService.userPreference.rules
    		&& _data.idRegola
    		){
    			_regole = null;
    			for(_idx = 0 ; _regole == null && _idx < NotificheService.userPreference.rules.length ; _idx++){
    				if(NotificheService.userPreference.rules[_idx].id == _data.idRegola){
    					_regole = NotificheService.userPreference.rules[_idx].preferenceNames; 
    				}
    			}
    			if(_regole && _regole != null && _regole.length > 0)
    				return _regole;
    		}    		
    		//Check su impostazioni per type    	
    		if(NotificheService.userPreference.typeName
    		&& _data.idType
    		){
    			_regole = NotificheService.userPreference.typeName[_data.idType];
    			if(_regole && _regole != null && _regole.length > 0)
    				return _regole;
    		}    		
    		//Check su impostazioni per severity    	
    		if(NotificheService.userPreference.severityName
    		&& _data.idSeverity
    		){
    			_regole = NotificheService.userPreference.severityName[_data.idSeverity];
    			if(_regole && _regole != null && _regole.length > 0)
    				return _regole;
    		}    		
    	}
    	//Se non c'è nessuna valorizzazione si utilizza quella della regola
    	if(_data.preferences){
    		return _data.preferences;
    	}
    	return [];
    };
    
    this.doPreferenceMessage = function(_data, _message){
    	_preferences = NotificheService.getPreferences(_data);
    	for(_key in _preferences){
    		_preference = _preferences[_key]; 
    		
    		if(_preference == NotificheService.getConstant('ALERT_PREFERENZE_COLOR')){
    			$('#myButtonNotifiche').addClass("evidenziaNotifica");
    		}
    		if(_preference == NotificheService.getConstant('ALERT_PREFERENZE_MESSAGE')){
    			NotificheService.showNotificaToast(_message);
    		}
    	}
    };
    
    this.showNotificaToast = function(_message) {
        var _position = 'top right';
        $mdToast.show($mdToast.simple()
                              .textContent(_message)
                              .position(_position)
                              .hideDelay(3000)
                    );
      };
      
      this.doPreferenceMap = function(_data, _layerPunto, _map){
      	_preferences = NotificheService.getPreferences(_data);
      	for(_key in _preferences){
      		_preference = _preferences[_key]; 
      		if(_preference == NotificheService.getConstant('ALERT_PREFERENZE_ZOOM')){
      			_coordinate = _layerPunto.getSource().getFeatures()[0].getGeometry().getCoordinates()
                var _bounce = ol.animation.bounce({duration: 3000, resolution: _map.getView().getResolution() * 2});
                var _pan    = ol.animation.pan   ({duration: 3000, source: _map.getView().getCenter()});
                var _zoom   = ol.animation.zoom  ({duration: 5000, resolution: _map.getView().getResolution()});
                
                _map.beforeRender(_bounce, _pan, _zoom);
                _map.getView().setCenter(_coordinate);
                _map.getView().setZoom(15);
                
      			
      		}
      	}
      };
	
//FUNCTION PER RECUPERO PARAMETRO IMPOSTAZIONE REGOLA
//Array con chiave ley proprieta' e valore la proprieta'	
	this.fields = [];
	//Recupera fieldId da key
	this.getFieldId = function(_key){
		_fieldId = this.fields[_key];
		if(!_fieldId)
			_fieldId = this.getConstant(_key);
		return _fieldId;
	};
	//Recupera valore field da array
	this.getFieldValue = function(_fields, _key){
		_fieldId = this.getFieldId(_key);
		for(var ruleFieldKey in _fields){
			_field = _fields[ruleFieldKey];
			if(_field.fieldId == _fieldId)
				return _field.fieldValue;
		}
		return '';
	};
	//Recupera valore field da regola
	this.getRuleField = function(_data, _key){
		return this.getFieldValue(_data.ruleFields, _key);
	};
//FUNCTION PER RECUPERO VALORE ALERT
	this.getAlertField = function(_data, _key){
		return this.getFieldValue(_data.alertFields, _key);
	};
//FUNCTION PER RECUPERO OBJECT ID: VEICOLO, SEMAFORO,...
	this.getObject = function(_data){
		_object = '';
		_sep     = '';
		if(_data.objectId
		&& _data.objectId != ''
		){
			_object = _data.objectId;
			_sep    = " - ";
		}
		if(_data.objectDescription
		&& _data.objectDescription != ''
		){
			_object += _sep + _data.objectDescription;
		}
		return _object;
	};
//**********************INIZIO FUNCTION GESTIONE NOTIFICA
//MESSAGGIO NOTIFICA
	this.getMessage = function(_data, _paramMessage){
		if(!_data.message)
			return '';
		_message =  $translate.instant(_data.message + ".message", _paramMessage);
		//Aggiunta data chiusura
		if(_data.timestampChiusura){
			_message += $translate.instant('notifica.dataChisura')
			          + DateService.formatUtcByMessage(_data.timestampChiusura, 'notifica.formatTimestampChisura')
			          ;
		}
		
		return _message;
	};
//MESSAGGIO MESSAGE ALERT DISTANZA PUNTO FISSO
	this.getMessageDisatnzaPuntoFisso = function(_data){
		_paramMessage = {vehicle : this.getObject   (_data)
				        ,distance: this.getRuleField(_data, 'ALERT_FIELD_DISTANCE')
				        ,point   : this.getRuleField(_data, 'ALERT_FIELD_POINT'   )
		                };
		return this.getMessage(_data, _paramMessage);
	};
//MESSAGGIO MESSAGE ALERT AREA PROTETTA
	this.getMessageAreaProtetta = function(_data){
		_paramMessage = {vehicle: this.getObject(_data)};
		return this.getMessage(_data, _paramMessage);
	};
//MESSAGGIO MESSAGE ALERT SEMAFORO GUASTO
	this.getMessageSemaforoGuasto = function(_data){
		_paramMessage = {trafficlight: this.getObject    (_data)
		                ,lon         : this.getAlertField(_data, 'ALERT_FIELD_LONGITUDINE')
		                ,lat         : this.getAlertField(_data, 'ALERT_FIELD_LATITUDINE' )
                        };
		return this.getMessage(_data, _paramMessage);
	};
//MESSAGGIO MESSAGE ALERT SEMAFORO RIPARATO
	this.getMessageSemaforoRiparato = function(_data){
		_paramMessage = {trafficlight: this.getObject    (_data)
                        ,lon         : this.getAlertField(_data, 'ALERT_FIELD_LONGITUDINE')
                        ,lat         : this.getAlertField(_data, 'ALERT_FIELD_LATITUDINE' )
                        };
		return this.getMessage(_data, _paramMessage);
	};
//MESSAGGIO MESSAGE ALERT SEGNALAZIONE INCENDIO
	this.getMessageIncendio = function(_data){
		_paramMessage = {lon: this.getAlertField(_data, 'ALERT_FIELD_LONGITUDINE')
                        ,lat: this.getAlertField(_data, 'ALERT_FIELD_LATITUDINE' )
                        };
		return this.getMessage(_data, _paramMessage);
	};
//MESSAGGIO MESSAGE ALERT SEGNALAZIONE TERMINE INCENDIO
	this.getMessageTermineIncendio = function(_data){
		_paramMessage = {lon: this.getAlertField(_data, 'ALERT_FIELD_LONGITUDINE')
				        ,lat: this.getAlertField(_data, 'ALERT_FIELD_LATITUDINE' )
		};
		return this.getMessage(_data, _paramMessage);
	};
//MESSAGGIO MESSAGE ALERT SEGNALAZIONE PRESENZA ARMA DA FUOCO
	this.getMessageArmaDaFuoco = function(_data){
		_paramMessage = {lon: this.getAlertField(_data, 'ALERT_FIELD_LONGITUDINE')
                        ,lat: this.getAlertField(_data, 'ALERT_FIELD_LATITUDINE' )
                        };
		return this.getMessage(_data, _paramMessage);
	};
//MESSAGGIO MESSAGE ALERT SEGNALAZIONE PRESENZA RITARDO
	this.getMessageRitardo = function(_data){
	    _paramMessage = {vehicle: this.getObject(_data)
	                    ,delay  : this.getAlertField(_data, 'ALERT_FIELD_RITARDO')
                        };
	    return this.getMessage(_data, _paramMessage);
	};
	this.getMessageAnomalia = function(_data){
		_paramMessage = {vehicle: this.getObject(_data)};
		return this.getMessage(_data, _paramMessage);
	};
//NOTIFICA ALERT DISTANZA PUNTO FISSO
	this.getNotificaDistanzaPuntoFisso = function(_data){
		_item = this.buildItemNotifica(_data, this.getMessageDisatnzaPuntoFisso(_data));
		if(this.addNotifica(_item, 'Notifica')){
			this.doPreferenceMessage(_data, _item.message);			
			return _item;
		}
		return null;
	};
	
//NOTIFICA ALERT AREA PROTETTA
	this.getNotificaAreaProtetta = function(_data){
		_item = this.buildItemNotifica(_data, this.getMessageAreaProtetta(_data));
		if(this.addNotifica(_item, 'Notifica')){
			this.doPreferenceMessage(_data, _item.message);			
			return _item;
		}
		return null;
	};
//NOTIFICA ALERT SEMAFORO GUASTO
	this.getNotificaSemaforoGuasto = function(_data){
		_item = this.buildItemNotifica(_data, this.getMessageSemaforoGuasto(_data));
		if(this.addNotifica(_item, 'Notifica')){
			this.doPreferenceMessage(_data, _item.message);			
			return _item;
		}
		return null;
	};
//NOTIFICA ALERT SEMAFORO RIPARATO
	this.getNotificaSemaforoRiparato = function(_data){
		_item = this.buildItemNotifica(_data, this.getMessageSemaforoRiparato(_data));
		if(this.addNotifica(_item, 'Notifica')){
			this.doPreferenceMessage(_data, _item.message);			
			return _item;
		}
		return null;
	};
//NOTIFICA ALERT SEGNALAZIONE INCENDIO
	this.getNotificaIncendio = function(_data){
		_item = this.buildItemNotifica(_data, this.getMessageIncendio(_data));
		if(this.addNotifica(_item, 'Notifica')){
			this.doPreferenceMessage(_data, _item.message);			
			return _item;
		}
		return null;
	};
//NOTIFICA ALERT SEGNALAZIONE TERMINE INCENDIO
	this.getNotificaTemineIncendio = function(_data){
		_item = this.buildItemNotifica(_data, this.getMessageTermineIncendio(_data));
		if(this.addNotifica(_item, 'Notifica')){
			this.doPreferenceMessage(_data, _item.message);			
			return _item;
		}
		return null;
	};
//NOTIFICA ALERT SEGNALAZIONE PRESENZA ARMA DA FUOCO
	this.getNotificaArmaDaFuoco = function(_data){
		_item = this.buildItemNotifica(_data, this.getMessageArmaDaFuoco(_data));
		if(this.addNotifica(_item, 'Notifica')){
			this.doPreferenceMessage(_data, _item.message);
			return _item;
		}
		return null;
	};
//NOTIFICA ALERT SEGNALAZIONE PRESENZA RITARDO
	this.getNotificaRitardo = function(_data){
		_item = this.buildItemNotifica(_data, this.getMessageRitardo(_data));
		if(this.addNotifica(_item, 'Notifica')){
			this.doPreferenceMessage(_data, _item.message);			
			return _item;
		}
		return null;
	};
//NOTIFICA ALERT SEGNALAZIONE ALLARME MEZZO
	this.getNotificaAllarmeMezzo = function(_data){
		_item = this.buildItemNotifica(_data, this.getMessageAnomalia(_data));
		this.doPreferenceMessage(_data, _item.message);			
		return _item;
	};
//FINE FUNZIONI PER NOTIFICHE ALERT
//FUNCTION PER BUILD NOTIFICA
	this.buildItemNotifica = function(_data, _message){
		_severity        = _data.severity;
		_tipoAlert       = _data.type;
		_item            = {date              : DateService.formatUtcByMessage(_data.timestamp, 'notifica.formatTimestamp')//Formattazione timestamp
			  	           ,id                : _data.id//id notifica
			  	           ,message           : _message//messaggio da visualizzare
			  	           ,objectId          : _data.objectId//id object associato a notifica
			  	           ,objectDescription : _data.objectDescription//description associato a notifica
			  	           ,type              : _tipoAlert//tipo notifica
			  	           ,severity          : _severity//Severity della notifica
			  	           ,idRule            : _data.idRegola//id regola
			  	           ,isAlarm           : _data.isAlarm//Se true la notifica e' di tipo alarm
			  	           ,timestamp         : _data.timestamp//timestamp chiusura
			  	           ,timestampChiusura : _data.timestampChiusura//timestamp prevista chisura
		                   };

		return _item;
	};
	this.drawAlert = function(_data){
		_item = this.buildItemNotifica(_data, '');
		_result = this.addNotifica(_item, 'Mappa');
		return _result;
	};
//FUNCTION PER VERIFICARE SE NOTIFICA GIA' PRESENTE ED AGGIUNGERLA NELLA LISTA DELLE NOTIFICHE
	this.addNotifica = function(_item, _objectRif){
		_trovato = false;
		for(_idx = 0 ; _idx < this.notificheAlert.length  && _trovato == false; _idx++){
			_oldItem = this.notificheAlert[_idx];
			if(_item.objectId == _oldItem.objectId
			&& _item.idRule   == _oldItem.idRule
			&& _objectRif     == _oldItem.objectRif
			&& (_item.timestamp - _oldItem.timestamp) <= (5 * 60 * 1000)
			&& (_item.timestamp - _oldItem.timestamp) > 0
		    ){
				_trovato = true;
			}

		}
		if(_trovato == false){
			_item.objectRif = _objectRif;
			this.notificheAlert.push(_item);
			return true;
		}
		return false;
	};
	this.layers = [];
	
	this.addItem = function(_map, _layer, _data){
		_feature = _layer.getSource().getFeatures()[0];
		_properties = _feature.getProperties();
		_properties.id = _data.id;
		_feature.setProperties(_properties);
		 this.layers[_data.id] = _layer;
		_map.addLayer(_layer);
	}
	this.removeItem = function(_map, _id){
		_layer = this.layers[_id];
		if(_layer){
			_map.removeLayer(_layer);
			this.layer.slice(_id);
		}
	}
	
//FUNCTION PER PULIZIA NOTIFICHE
	this.pollingNotificheAlert = function() {
		_pollingTime              = NotificheService.getConstant('POLLING_NOTIFICHE');
		_currentTimestamp         = new Date().getTime();
		_notificheAlertTemporanea = NotificheService.notificheAlert;

		for(var i = _notificheAlertTemporanea.length -1; i >= 0 ; i--){
		    if(_currentTimestamp - _notificheAlertTemporanea[i].timestamp > _pollingTime){
		    	_notificheAlertTemporanea.splice(i, 1);
		    }
		}

		NotificheService.notificheAlert = _notificheAlertTemporanea;

    	$timeout(function() {NotificheService.pollingNotificheAlert();}
                ,_pollingTime
                );
    };
//**********************FINE FUNCTION GESTIONE NOTIFICA
//**********************INIZIO FUNCTION GESTIONE MAPPA
    this.getLayerName = function(){
    	return configuration.getParam("Constants").layersName["TPL_NOTIFICHE"];
    };
//get point layer to add in map
    this.getPointLayer = function(_longitudine, _latitudine, _style){
    	return olLayerService.getPointLayer(_longitudine
    			                           ,_latitudine
    			                           ,this.SOURCE_PROJECTION
    			                           ,this.DEST_PROJECTION
    			                           ,!_style ? olStyleService.createSimpleStylePoint() : _style
    			                           ,100
    			                           );

    };
    this.getPointLayerWKT = function(_wktSring){
    	return olLayerService.getPointLayerFromWKT(_wktSring
    			                                  ,this.SOURCE_PROJECTION
    			                                  ,this.DEST_PROJECTION
    			                                  ,this.getPointStyle()
    			                                  ,1
    	                                          );
    };
//get circle layer
    this.getCircleLayer = function(_longitudine, _latitudine, _raggio){
    	 return olLayerService.getCircleLayer(_longitudine
                                             ,_latitudine
                                             ,_raggio
                                             ,this.SOURCE_PROJECTION
			                                 ,this.DEST_PROJECTION
                                             ,olStyleService.createCirconferenzaStyle()
                                             ,1
                                             );
    };
    this.getCircleLayerWKT = function(_wktString, _raggio){
    	return olLayerService.getCircleLayerFromWKT(_wktString
                                                   ,_raggio
                                                   ,this.SOURCE_PROJECTION
                                                   ,this.DEST_PROJECTION
                                                   ,olStyleService.createCirconferenzaStyle()
                                                   ,1
                                                   );
    };
//get circle layer
    this.getPolygonLayer = function(_wktString, sourceprj){
    	  sourceprj= (typeof sourceprj !== "undefined") ? sourceprj : this.SOURCE_PROJECTION;
    	return olLayerService.getPolygonLayer(_wktString
    			                             ,sourceprj
                                             ,this.DEST_PROJECTION
                                             ,olStyleService.createDefaultPolygonStyle()
                                             ,1
                                             );
    };
//ARRAY CHE INDICHERA' LE RULE ID GIA' DISEGNATE
    this.ruleMapped = [];
//FUNZIONE PER VERIFICARE SE REGOLA GIA' E' STATA DISEGNATA
    this.isRuleDrawed = function(_data){
    	_idRegola = _data.idRegola;
    	if(_idRegola in this.ruleMapped)
    		return true;

    	this.ruleMapped[_idRegola] = '';

    	return false;
    };
//ADD MESSAGE IN LAYER PER TOOLTIP
    this.addMessageToMap = function(_data, _layer, _message){
    	_feature         = _layer.getSource().getFeatures()[0];
    	_tipoAlert       = _data.type;
    	_feature.setProperties({message: _message});
    	_layer.setName(this.getLayerName());
    };
/**
 * @return Stile notifica semafori
 */    
    this.getStyleImg = function(_img, _size){
    	if(!_size)
    		_size = [30, 30];
    	_image = olStyleService.createOlStyleIcon(this.getContextPath() + '/app/shared/layer_marker_icon/' + _img + '.png'
    			                                 ,_size
                                                 );
    	return new ol.style.Style({image : _image 
    		                      ,zIndex: 2
                                  });
    };
//DRAW ALERT DISTANZA PUNTO FISSO
    this.drawNotificaDisatnzaPuntoFisso = function(_data, _map){
    	if(this.drawAlert(_data) == false)
    		return ;
    	_latitudine  = this.getAlertField(_data, 'ALERT_FIELD_LATITUDINE' );
    	_longitudine = this.getAlertField(_data, 'ALERT_FIELD_LONGITUDINE');
    	_layerPunto  = this.getPointLayer(_longitudine, _latitudine, this.getStyleImg('m_notifica_distanza_punto_fisso'),[39, 75]);

    	this.addMessageToMap(_data, _layerPunto, this.getMessageDisatnzaPuntoFisso(_data));

    	this.addItem(_map, _layerPunto, _data);
    	if(this.isRuleDrawed(_data) == false){
    		_wktPoint     = this.getRuleField (_data, 'ALERT_FIELD_POINT'   );
    		_distance     = this.getRuleField (_data, 'ALERT_FIELD_DISTANCE');
    		_layerCerchio = this.getCircleLayerWKT(_wktPoint, _distance * 1000);//Da Km a m

    		_map.addLayer(_layerCerchio);
    	}
    	
    	this.doPreferenceMap(_data, _layerPunto, _map);
    };
//DRAW ALERT AREA PROTETTA
    this.drawNotificaAreaProtetta = function(_data, _map){
    	if(this.drawAlert(_data) == false)
    		return ;
    	_latitudine  = this.getAlertField(_data, 'ALERT_FIELD_LATITUDINE' );
    	_longitudine = this.getAlertField(_data, 'ALERT_FIELD_LONGITUDINE');

    	_layerPunto = this.getPointLayer(_longitudine, _latitudine, this.getStyleImg('m_notifica_area_protetta'));

    	this.addMessageToMap(_data, _layerPunto, this.getMessageAreaProtetta(_data));

    	this.addItem(_map, _layerPunto, _data);
    	if(this.isRuleDrawed(_data) == false){
    		_wktPolygon   = this.getRuleField(_data, 'ALERT_FIELD_POLYGON');
    		_layerPolygon = this.getPolygonLayer(_wktPolygon);
    		_map.addLayer(_layerPolygon);
    		
    	}
    	this.doPreferenceMap(_data, _layerPunto, _map);
    	 
    };
//ARRAY PER ELIMINARE NOTIFICA SEMAFORO GUASTO QUANDO E' STATO RIPARATO
    this.notificheSemaforiGuasti   = [];
    this.notificheSemaforiRiparati = [];
/**
 * @return Stile notifica semafori
 */    
    this.getStyleSemaforo = function(_isGuasto){
    	_image = olStyleService.createOlStyleIcon(this.getContextPath() + '/app/shared/layer_marker_icon/ ' + (_isGuasto ? "m_notifica_semaforo_guasto" : "m_notifica_semaforo_riparato") + '.png'
                                                 ,[30, 68]
                                                 );
    	_image.setScale(0.5);
    	return new ol.style.Style({image: _image
		 	                      ,zIndex: 2
		                         });
    };
//DRAW ALERT SEMAFORO GUASTO
    this.drawNotificaSemaforoGuasto = function(_data, _map){
    	if(this.drawAlert(_data) == false)
    		return ;
    	_layer      = this.drawNotificaPunto(_data, _map, this.getMessageSemaforoGuasto(_data), this.getStyleSemaforo(true));
    	_idSemaforo = _data.objectId;
//Si elimina eventuale segnalazione semaforo riparato
    	_layerSemaforoRiaprato = this.notificheSemaforiRiparati[_data.objectId]
    	if(_layerSemaforoRiaprato !== undefined){
    		_map.removeLayer(_layerSemaforoRiaprato);
    		this.notificheSemaforiRiparati.slice(_idSemaforo);
    	}
//Si salva layer del semaforo guasto per eliminarlo quando è riparato
    	this.notificheSemaforiGuasti[_idSemaforo] = _layer;
    };
//DRAW ALERT SEMAFORO RIPARATO
    this.drawNotificaSemaforoRiparato = function(_data, _map){
    	_layer = this.drawNotificaPunto(_data, _map, this.getMessageSemaforoRiparato(_data), this.getStyleSemaforo(false));
//Si elimina eventuale segnalazione semaforo guasto
    	_idSemaforo          = _data.objectId;
    	_layerSemaforoGuasto = this.notificheSemaforiGuasti[_data.objectId]
    	if(_layerSemaforoGuasto !== undefined){
    		_map.removeLayer(_layerSemaforoGuasto);
    		this.notificheSemaforiGuasti.slice(_idSemaforo);
    	}
//Si salva layer del semaforo riparato per eliminarlo se c'è una nuova segnalazione di guasto
    	this.notificheSemaforiRiparati[_idSemaforo] = _layer;
    };
//DRAW ALERT SEMAFORO INCENDIO
/**
 * @return Stile notifica incendio
 */    
    this.getStyleIncendio = function(){
    	_image = olStyleService.createOlStyleIcon(this.getContextPath() + '/app/shared/layer_marker_icon/m_notifica_incendio.png'
    			                                 ,[30, 30]
                                                 );
    	return new ol.style.Style({image: _image 
		 	                     ,zIndex: 2
		                         });
    };    
    this.drawNotificaIncendio = function(_data, _map){
    	this.drawNotificaPunto(_data, _map, this.getMessageIncendio(_data), this.getStyleIncendio());
    };
    
    this.drawNotificaTermineIncendio = function(_data, _map){
    	this.drawNotificaPunto(_data, _map, this.getMessageTermineIncendio(_data), this.getStyleIncendio());
    };
//DRAW ALERT SEMAFORO ARMA DA FUOCO
/**
 * @return Stile notifica semafori
 */    
    this.getStyleArmaDaFuoco = function(){
    	_image = olStyleService.createOlStyleIcon(this.getContextPath() + '/app/shared/layer_marker_icon/m_notifica_arma_da_fuoco.png'
    			                                ,[30, 30]
                                                 );
        return new ol.style.Style({image: _image 
                                  ,zIndex: 2
                                 });
    };    
    this.drawNotificaArmaDaFuoco = function(_data, _map){
    	this.drawNotificaPunto(_data, _map, this.getMessageArmaDaFuoco(_data), this.getStyleArmaDaFuoco());
    };
//DRAW ALERT RITARDO
/**
 * @return Stile notifica semafori
 */    
    this.getStyleRitardo = function(){
    	_image = olStyleService.createOlStyleIcon(this.getContextPath() + '/app/shared/layer_marker_icon/m_notifica_ritardo.png'
    			                                 ,[30, 30]
                                                 );
    	return new ol.style.Style({image: _image
                                  ,zIndex: 2
                                  });
    };    
    /**
     * FUCNTION PER DISEGNO NOTIFICA RITARDO
     */
    this.drawNotificaRitardo = function(_data, _map){
    	this.drawNotificaPunto(_data, _map, this.getMessageRitardo(_data), this.getStyleRitardo());
    };
    this.getStyleAnomaliaMezzo = function(){
    	_image = olStyleService.createOlStyleIcon(this.getContextPath() + '/app/shared/layer_marker_icon/m_notifica_anomalia_mezzo.png'
    			                                 ,[30, 30]
                                                 );
    	return new ol.style.Style({image: _image
                                  ,zIndex: 2
                                  });
    };
    /**
     * FUCNTION PER DISEGNO NOTIFICA MEZZO
     */
    this.drawNotificaAllarmeMezzo = function(_data, _map){
    	this.drawNotificaPunto(_data, _map, this.getMessageAnomalia(_data), this.getStyleAnomaliaMezzo(), true);
    };
//FUNCTION GENERICA PER VISUALIZZARE SU MAPPA LAERT SOLO DI UN PUNTO
    this.drawNotificaPunto = function(_data, _map, _message, _style, _alwaysAdd){
    	if(!_alwaysAdd && this.drawAlert(_data) == false)
    		return ;
    	_latitudine   = this.getAlertField(_data, 'ALERT_FIELD_LATITUDINE' );
    	_longitudine  = this.getAlertField(_data, 'ALERT_FIELD_LONGITUDINE');
    	_layerPunto = this.getPointLayer(_longitudine, _latitudine, _style);

    	this.addMessageToMap(_data, _layerPunto, _message);

    	this.addItem(_map, _layerPunto, _data);
    	this.doPreferenceMap(_data, _layerPunto, _map);
    	return _layerPunto;
    };
//**********************FINE FUNCTION GESTIONE MAPPA
}]);